home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / examples / yafr_121 / part02 < prev   
Encoding:
Internet Message Format  |  1990-07-08  |  54.8 KB

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i205: YAFR 1.21 - yet another file requester, Part02/02
  5. Message-ID: <13083@xanth.cs.odu.edu>
  6. Date: 8 Jul 90 16:04:57 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: davids@ucscb.UCSC.EDU (Dave Schreiber)
  9. Lines: 1242
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: davids@ucscb.UCSC.EDU (Dave Schreiber)
  15. Posting-number: Volume 90, Issue 205
  16. Archive-name: examples/yafr-1.21/part02
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 2 (of 2)."
  25. # Contents:  YAFR.c yftest.uu
  26. # Wrapped by tadguy@xanth on Sun Jul  8 12:03:41 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'YAFR.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'YAFR.c'\"
  30. else
  31. echo shar: Extracting \"'YAFR.c'\" \(29701 characters\)
  32. sed "s/^X//" >'YAFR.c' <<'END_OF_FILE'
  33. X/*- - - - - - - - - - YAFR - Yet Another File Requester - - - - - - - - -*/
  34. X/*- - - - - - - - - - - - - - Version  1.21 - - - - - - - - - - - - - - -*/
  35. X
  36. X/*YAFR V1.21 Copyright (c)1989,1990 by Dave Schreiber. All rights reserved.*/
  37. X/*YAFR is freely distributable, and may be sold as part of a commercial  */
  38. X/*program. This copyright message must be included in the documentation  */
  39. X/*for any program, commercial or otherwise, that uses YAFR. Use of YAFR  */
  40. X/*in a rogram does not detract in any way from the ownership of YAFR by  */
  41. X/*its author, Dave Schreiber, nor does it change its status as a freely  */
  42. X/*distributable program.  Dave Schreiber reserves the right to forbid any*/
  43. X/*person or company from incorporating YAFR as part of a program owned by*/
  44. X/*that person or company.                                                */
  45. X
  46. X/*Compiled under Lattice C V5.04                                         */
  47. X/*Command line:  1> lc -cw -j30 yafr                                     */
  48. X/*Generates YAFR.o which is linked into the host program                 */
  49. X
  50. X/*If you have any comments, suggestions, etc. I can be reached at:       */
  51. X/*Dave Schreiber                                                         */
  52. X/*1234 Collins Lane                                                      */
  53. X/*San Jose, CA   95129-4208                                              */
  54. X/*Usenet:  davids@ucscb.ucsc.edu (during the school year)                */
  55. X/*         davids@cup.portal.com (other times)                           */
  56. X
  57. X#include "yafrHead.h"
  58. X             /*^^^^system includes, structure definitions, etc.*/
  59. X#define CRNT header.current->fib
  60. X
  61. X/*Parameters are:  fn-string for filename (33 characters)                */
  62. X/*dn-string for directory name (150 characters)                          */
  63. X/*en-string for file pattern (#?.c, file1?, etc. 150 characters)         */
  64. X/*cn-string for combined directory and filename (183 characters)         */
  65. X/*(NULL if you don't want the combined filename)                         */
  66. X/*X,Y-YAFR's window's X,Y location (relative to the screen               */
  67. X/*wn-text for YAFR's window's title bar                                  */
  68. X/*scr-Pointer to screen that window should appear on (NULL for           */
  69. X/*Workbench) filepen-Pen color that filenames should be displayed in     */
  70. X/*dirpen-Pen color that directory names should be displayed in           */
  71. X/*DisableInfo-Boolean; TRUE-files ending in .info aren't displayed       */
  72. X/*                     FALSE-.info files are displayed                   */
  73. X
  74. X/*Note!  IntuitionBase, GfxBase, and DOSBase must be opened by the       */
  75. X/*calling program before YAFR is called.  DOSBase is usually opened by   */
  76. X/*the C startup code, but the others aren't.  If they aren't, YAFR will  */
  77. X/*crash!  Be warned.                                                     */
  78. X
  79. X/*Version 1.1, completed October 30, 1989*/
  80. X/*Directory and filename string gadgets now auto-activate and appropriate*/
  81. X/*times.  A bug that caused an incorrect filename to be returned when the*/
  82. X/*user pressed CANCEL has been fixed                                     */
  83. X
  84. X/*Version 1.15 completed January 23, 1990*/
  85. X/*A bug that could cause the name of a directory to run outside the      */
  86. X/*filename box has been eliminated.  Also, device names are now converted*/
  87. X/*into volume names when selected from the device name buttons on the    */
  88. X/*right (ex. on my system, when DH2: is pressed, Data: is the name that  */
  89. X/*appears in the directory box.  The source code has had many more       */
  90. X/*comments added to it and there are new distribution requirements.      */
  91. X
  92. X/*Version 1.21 completed May 6, 1990*/
  93. X/*The device gadgets now get their choices from the AmigaDOS list of     */
  94. X/*devices, instead of being hard-coded in.  Filenames can now be selected*/
  95. X/*by double clicking on the filename in the filename box.  The code has  */
  96. X/*also been cleaned up a little (Lattice & Amiga functions are now used  */
  97. X/*in place of some of the custom functions used in V1.15 & previous, in  */
  98. X/*particular, ispipedevice() and RefreshGadget() ).  Finally, the what   */
  99. X/*used to be the filename extension box has now become a more general--  */
  100. X/*purpose wildcard selector (using standard AmigaDOS wildcards; no *     */
  101. X/*here!).  Thanks to Dave Haynie for the DiskSalv wildcard code I used.  */
  102. X
  103. X/*Thanks also to Bruce Rogers for his FindRoot code which has been       */
  104. X/*incorporated in YAFR.                                                  */
  105. X
  106. X/*-----------------------------------------------------------------------*/
  107. X
  108. X#include "pattern.h"
  109. X
  110. X#ifdef DSOIFEW
  111. Xtypedef struct {        /*Required for pattern matching routine*/
  112. X   char *aux;
  113. X   BYTE type;
  114. X} pattern;
  115. X
  116. Xextern pattern *CompilePattern(char *str);
  117. Xextern BOOL MatchPattern(pattern *,char *);
  118. X#endif
  119. X
  120. Xpattern *MasterPattern;
  121. X
  122. X/*Main function.  This is what is called by the host program:*/
  123. X
  124. XGetFilename(fn,dn,en,cn,X,Y,wn,scr,filepen,dirpen,DisableInfo)
  125. Xchar *fn,*dn,*en,*cn,*wn;  /*See above for parameter definitions*/
  126. XUSHORT X,Y,filepen,dirpen;
  127. XBYTE DisableInfo;
  128. Xstruct Screen *scr;
  129. X{
  130. X   int status=GN_NEWDIR;
  131. X   struct FileLock *DirLock;
  132. X   char temp[150];
  133. X
  134. X   if(DisableInfo)
  135. X      Info.Flags|=SELECTED;
  136. X   else
  137. X      Info.Flags=GADGHIMAGE|GADGIMAGE;
  138. X
  139. X   yafr_e_FilenamePenColor = filepen;
  140. X   yafr_e_DirnamePenColor = dirpen;
  141. X   DirLock=(struct FileLock *)Lock(dn,ACCESS_READ);
  142. X         /*Get lock on first directory*/
  143. X   
  144. X   if(en[0]==NULL)   /*If no pattern was provided*/
  145. X      strcpy(en,"#?");  /*provide one that will give us everything*/
  146. X   
  147. X   strcpy(temp,en);
  148. X   
  149. X   MasterPattern = (pattern *)CompilePattern(temp);
  150. X      /*Compile the pattern matching structure*/
  151. X   
  152. X   strcpy(DirNameSIBuff,dn);  /*Copy some parameters to this modules*/
  153. X   strcpy(ExtNameSIBuff,en);  /*variables*/
  154. X   strcpy(filenameSIBuff,fn);
  155. X   NewFNWindow.LeftEdge=X;
  156. X   NewFNWindow.TopEdge=Y;
  157. X   NewFNWindow.Title=(char *)wn;
  158. X   NewFNWindow.Screen=(struct Screen *) scr;
  159. X   
  160. X         /*If there's a screen, open on it.  Workbench screen otherwise*/
  161. X   NewFNWindow.Type= (scr) ? CUSTOMSCREEN : WBENCHSCREEN;
  162. X
  163. X   PutDevicesInGadgets(NULL,NULL);
  164. X      /*Open the window*/
  165. X   if((FNWindow=(struct Window *)OpenWindow(&NewFNWindow))==NULL)
  166. X      {  /*If it failed...*/
  167. X      UnLock(DirLock); /*Unlock the directory*/
  168. X      return(FALSE);   /*and return*/
  169. X      }
  170. X      
  171. X   /*Write some important text into the title bar:  */
  172. X   SetWindowTitles(FNWindow,-1,"YAFR V1.21 (c)1989, 1990 by Dave Schreiber");
  173. X   
  174. X   
  175. X   SetAPen(FNWindow->RPort,1);
  176. X   Move(FNWindow->RPort,6,19);
  177. X   Text(FNWindow->RPort,"Directory",9);
  178. X   Move(FNWindow->RPort,6,154);
  179. X   Text(FNWindow->RPort,"Pattern",7);
  180. X   Move(FNWindow->RPort,6,165);
  181. X   Text(FNWindow->RPort,"Filename",8);
  182. X   
  183. X      /*Activate the directory string gadget, for user's convenience*/
  184. X      /*Note!  Window must be active for ActivateGadget to work on a*/
  185. X      /*string window!  Take this into account in writing your own code.*/
  186. X      /*I had to learn the hard way...:-( */
  187. X   
  188. X   ActivateGadget(&DirName,FNWindow,NULL);
  189. X   
  190. X   /*Main loop:  While requests for reading a new directory keep coming in...*/
  191. X   while((status = GetName(DirLock)) == GN_NEWDIR)
  192. X      {                             /*keep doing it...*/
  193. X      UnLock(DirLock);  /*Transfer lock to new directory*/
  194. X      RefreshGList(&DirName,FNWindow,NULL,1);
  195. X      DirLock=(struct FileLock *)Lock(DirNameSIBuff,ACCESS_READ);
  196. X      ActivateGadget(&filename,FNWindow,NULL); /*Activate filename gadget*/
  197. X      }  /*Loop back, read the new directory, and wait for input again*/
  198. X
  199. X   UnLock(DirLock); /*Or we could be finished*/
  200. X   if(status) /*If OK pressed...*/
  201. X   {
  202. X      strcpy(fn,filenameSIBuff); /*Setup the return parameters*/
  203. X      strcpy(dn,DirNameSIBuff);
  204. X      strcpy(en,ExtNameSIBuff);
  205. X      if(cn) /*If cn isn't NULL, there's space for a string, so...*/
  206. X      {        /*construct the full filename for the host*/
  207. X         strcpy(cn,DirNameSIBuff);
  208. X         if( (dn[strlen(dn)-1] != ':') && strlen(dn)  && dn[strlen(dn)-1]!='/')
  209. X            strcat(cn,"/");
  210. X         strcat(cn,filenameSIBuff);
  211. X      }
  212. X   }
  213. X
  214. X   CloseWindow(FNWindow); /*Close the window*/
  215. X   ResetGadgets();
  216. X   return(status);      /*and return*/
  217. X}
  218. X
  219. XGetName(Lock)     /*Gets filenames in the directory associated with the*/
  220. Xstruct FileLock *Lock;  /*lock, and also gets user input*/
  221. X{
  222. X   struct fibHeader header;
  223. X   int status3,status2,status;
  224. X   USHORT FNNumber=0;
  225. X
  226. X   header.first=header.directory=NULL;
  227. X   if(GetFib(&header)==FALSE)
  228. X      return(FALSE);
  229. X   SliderSInfo.VertPot=0;
  230. X   UpdateSlider(1,&SliderSInfo,&Slider);
  231. X   ClearFileBox();
  232. X   if(strnicmp(DirNameSIBuff,"PIPE:",5)) /*Check for pipe: device*/
  233. X      if(Lock!=NULL) /*If the lock (& the directory) exist...*/
  234. X         {
  235. X         Examine(Lock,&(CRNT));  /*Get the first entry*/
  236. X         if(GetFib(&header)==FALSE)  /*Get next node*/
  237. X            return(NULL);
  238. X         while((status3=ExNext(Lock,&(CRNT)))) /*Loop while there are files*/
  239. X            {
  240. X            if((status2=((CheckExt(CRNT.fib_FileName) ||
  241. X                  CRNT.fib_DirEntryType > 0) && /*If the specified extension*/
  242. X                  CheckInfo(CRNT.fib_FileName)) )) /*(if any) matches and*/
  243. X               {              /*it isn't a .info file (if masked)*/
  244. X               if(FNNumber<10)   /*display it...*/
  245. X                  PrintFileName(&(CRNT),Rp,XBorder,YBorder+(10*FNNumber++));
  246. X               else  /*or update the slider (if the filename box is full)*/
  247. X                  UpdateSlider(++FNNumber,&SliderSInfo,&Slider);
  248. X               }
  249. X            while((status=CheckIntuiMessages(FNNumber,&header))!=GN_DONE)
  250. X               {  /*After getting a name, checked for IDCMP messages*/
  251. X               if(status==GN_PARENT) /*If PARENT was pressed*/
  252. X                  {
  253. X                  Parentize(DirNameSIBuff); /*Setup the parent dir*/
  254. X                  RefreshGList(&DirName,FNWindow,NULL,1);
  255. X                  FreeFuncMemory(header.directory); /*Free the filename*/
  256. X                  return(GN_NEWDIR);   /*list and return*/
  257. X                  }
  258. X               if(status < GN_PARENT)
  259. X                  {
  260. X                  FreeFuncMemory(header.directory);
  261. X                  return(status);   /*For OK,NEWDIR, & CANCEL*/
  262. X                  }
  263. X               }
  264. X            if(status2) /*If the filename was valid, append another Fib*/
  265. X               if(GetFib(&header)==FALSE) /*structure for the next filename*/
  266. X                  return(NULL);
  267. X              /*If not valid, let the next filename info overwrite the current*/
  268. X              /*Fib*/
  269. X            }
  270. X            header.current->prev->next=NULL; /*Delete the last (unused) Fib*/
  271. X            if(header.directory->next == header.current) /*If no files*/
  272. X               header.directory->next=header.first=header.last=
  273. X                     header.top=NULL;     /*NULL certain pointers*/
  274. X            FreeMem(header.current,sizeof(struct fibNode));
  275. X         }
  276. X   for(;;)  /*Loop until the users says 'Change something!'*/
  277. X      {
  278. X      Wait(1<<FNWindow->UserPort->mp_SigBit);
  279. X      while((status=CheckIntuiMessages(FNNumber,&header))!=GN_DONE)
  280. X         {
  281. X         if(status==GN_PARENT)   /*PARENT pushed*/
  282. X            if(Parentize(DirNameSIBuff))
  283. X               {
  284. X               RefreshGList(&DirName,FNWindow,NULL,1);
  285. X               FreeFuncMemory(header.directory);
  286. X               return(GN_NEWDIR);
  287. X               }
  288. X         if(status < GN_PARENT)  /*Something else pushed*/
  289. X            {
  290. X            FreeFuncMemory(header.directory);
  291. X            return(status);   /*For OK,NEWDIR, & CANCEL*/
  292. X            }
  293. X         }
  294. X      }
  295. X}
  296. X
  297. XCheckInfo(name)  /*Check to see if .info's should be printed*/
  298. Xchar *name;
  299. X{
  300. X   if(!(Info.Flags & SELECTED))
  301. X      return(TRUE);
  302. X
  303. X   return(!(strcmp(&name[strlen(name)-5],".info")==0));
  304. X}
  305. X
  306. Xvoid ClearFileBox() /*Clear the box with the filenames in it*/
  307. X{
  308. X   SetAPen(Rp,0);
  309. X   RectFill(Rp,XBorder,YBorder-6,(25*8)+XBorder,YBorder+(100)-4);
  310. X   SetAPen(Rp,1);
  311. X}
  312. X
  313. XBYTE Parentize(str) /*Convert a directory identifier string into the one*/
  314. Xchar *str;        /*for its parent directory*/
  315. X{
  316. X   int c,stat;
  317. X
  318. X   if(str[0]==NULL)  /*If there is no directory explicitly specified*/
  319. X   {
  320. X      strcpy(str,"/");  /*Go to the parent of the current directory*/
  321. X      return(TRUE);
  322. X   }
  323. X      
  324. X   for(c=0,stat=TRUE;str[c]!=NULL && stat;c++)
  325. X      stat=(str[c]=='/');  /*If nothing but /'s, add another /*/
  326. X      
  327. X   if(stat)
  328. X   {
  329. X      strcat(str,"/");
  330. X      return(TRUE);
  331. X   }
  332. X      
  333. X   if(str[strlen(str)-1]==':')   /*If ':' is the last character*/
  334. X      return(FALSE);          /*We're at the root, and cannot back up*/
  335. X   
  336. X   stat=FALSE;
  337. X   
  338. X   for(c=strlen(str)-1;c >= 0;c--)
  339. X      if(str[c]=='/')   /*Delete last '/' & everything after that*/
  340. X      {
  341. X         if(c==0 || str[c-1]=='/')
  342. X            str[c+1]=NULL;
  343. X         else
  344. X            str[c]=NULL;
  345. X         c=0;
  346. X         stat = TRUE;
  347. X      }
  348. X      else
  349. X         if(str[c]==':')   /*Or delete everything after the ':'*/
  350. X         {              /*(which leaves the root)*/
  351. X            str[c+1]=NULL;
  352. X            c=0;
  353. X            stat=TRUE;
  354. X         }
  355. X   if(!stat)   /*If neither a / or a : were found, delete the whole thing*/
  356. X      strcpy(str,"");
  357. X   return(TRUE);
  358. X}
  359. X
  360. Xvoid UpdateSlider(Amt,Info,Gadgt) /*Update the slider bar to reflect*/
  361. XUSHORT Amt;             /*the number of file/dir names available for selection*/
  362. Xstruct PropInfo *Info;
  363. Xstruct Gadget *Gadgt;
  364. X{
  365. X   Info->VertBody=((0xFFFF*10)/Amt);
  366. X   RefreshGadgets(Gadgt,FNWindow,NULL);
  367. X}
  368. X
  369. XCheckIntuiMessages(Max,header) /*Check and respond to the window's IDCMP*/
  370. XUSHORT Max;             /*messages*/
  371. Xstruct fibHeader *header;
  372. X{
  373. X   struct fibNode *cur;
  374. X   UBYTE c,line;
  375. X   struct IntuiMessage *mesg;
  376. X   struct Gadget *InUse;
  377. X   ULONG Class,Seconds,Micros;
  378. X   static ULONG OldSeconds=0;
  379. X   static ULONG OldMicros=0;
  380. X   USHORT Code;
  381. X   SHORT X,Y;
  382. X   char temp[150];
  383. X
  384. X   /*Assumes that the calling function has either Wait()ed or wants to*/
  385. X   /*handle any IDCMP messages that have piled up*/
  386. X   
  387. X   while((mesg=(struct IntuiMessage *)GetMsg(FNWindow->UserPort))!=NULL)
  388. X      {
  389. X      InUse=(struct Gadget *)mesg->IAddress;
  390. X      X=mesg->MouseX;
  391. X      Y=mesg->MouseY;
  392. X      Class=mesg->Class;
  393. X      Code=mesg->Code;
  394. X      Seconds=mesg->Seconds;
  395. X      Micros=mesg->Micros;
  396. X      ReplyMsg(mesg); /*Reply to the message*/
  397. X      switch(Class)  /*Decide what happened*/
  398. X         {
  399. X         case MOUSEMOVE: /*If the mouse moved, then the silder is down, so*/
  400. X            if(Max > 10) /*update the filenames in the box to reflect the*/
  401. X               UpdateList(SliderSInfo.VertPot,Max,header); /*slider's*/
  402. X            break;                                               /*position*/
  403. X         case GADGETUP:
  404. X            if(InUse->GadgetID <= 10)
  405. X            {  /*One of the device gadgets was pushed*/
  406. X               if(strnicmp(InUse->GadgetText->IText,"PIPE:",5))
  407. X               {        /*Find the volume name if it isn't the PIPE:*/
  408. X                  MakeAbsName(InUse->GadgetText->IText);
  409. X                  strcpy(DirNameSIBuff,absDirName);
  410. X                  strcat(DirNameSIBuff,":");
  411. X               }
  412. X               else
  413. X                  strcpy(DirNameSIBuff,InUse->GadgetText->IText);
  414. X               RefreshGList(&DirName,FNWindow,NULL,1);
  415. X               return(GN_NEWDIR);
  416. X            }
  417. X            switch(InUse->GadgetID)
  418. X            {
  419. X               case 14: /*CANCEL was pushed*/
  420. X                  return(GN_CANCEL);
  421. X               case 12: 
  422. X               case 13: /*OK was pushed or return was pressed in the*/
  423. X                 return(GN_OK);  /*filename's box*/
  424. X               case 15:
  425. X                  return(GN_PARENT); /*PARENT was pushed*/
  426. X               case 18:  /*Return was pushed in file pattern box*/
  427. X                  if(ExtNameSIBuff[0]==NULL) /*If a blank field*/
  428. X                  {
  429. X                     strcpy(ExtNameSIBuff,"#?"); /*give a global file pattern*/
  430. X                     RefreshGList(&ExtName,FNWindow,NULL,1);
  431. X                  }
  432. X                  strcpy(temp,ExtNameSIBuff);
  433. X                  MasterPattern=(pattern *)CompilePattern(temp);
  434. X               case 11:  /*Return was pushed in the filename box*/
  435. X                  return(GN_NEWDIR);  /*a new one*/
  436. X            }
  437. X            return(GN_RIEN);     /*Nothing important*/
  438. X         case DISKINSERTED:
  439. X            PutDevicesInGadgets(FNWindow,DISKINSERTED);
  440. X            return(GN_RIEN);
  441. X         case DISKREMOVED:
  442. X            PutDevicesInGadgets(FNWindow,DISKREMOVED);
  443. X            return(GN_RIEN);
  444. X         case GADGETDOWN:     /*The .info gadget was pressed?*/
  445. X         if(InUse->GadgetID == 18)
  446. X            return(GN_NEWDIR);
  447. X
  448. X            /*A file/dir name in the box was clicked on*/
  449. X         if(strnicmp(DirNameSIBuff,"PIPE:",5)) /*If the pipe:*/
  450. X            {                             /*don't try & get a filename*/
  451. X            line=(Y-YBorder+7)/10;    /*Get line clicked on*/
  452. X            
  453. X            for(c=0,cur=(struct fibNode *)header->top;c!=line && cur!=NULL;c++)
  454. X               cur=(struct fibNode *)cur->next; /*Find the file's Fib*/
  455. X               
  456. X            if(cur != NULL)   /*If the file exists*/
  457. X               if(cur->fib.fib_DirEntryType > 0)
  458. X               {        /*It's a directory, so read that directory*/
  459. X                  if(DirNameSIBuff[strlen(DirNameSIBuff)-1] != ':' && 
  460. X                        DirNameSIBuff[strlen(DirNameSIBuff)-1] != '/')
  461. X                     if(DirNameSIBuff[0]!=NULL)
  462. X                        strcat(DirNameSIBuff,"/"); 
  463. X                        
  464. X                  strcat(DirNameSIBuff,cur->fib.fib_FileName);
  465. X                  RefreshGList(&DirName,FNWindow,NULL,1);
  466. X                  return(GN_NEWDIR);
  467. X               }
  468. X               else   /*otherwise, return the filename clicked upon*/
  469. X               {
  470. X                  if(strcmp(filenameSIBuff,cur->fib.fib_FileName)==0 && 
  471. X                        DoubleClick(OldSeconds,OldMicros,Seconds,Micros))
  472. X                     return(GN_OK); /*Double-click == OK*/
  473. X                  strcpy(filenameSIBuff,cur->fib.fib_FileName);
  474. X                  RefreshGList(&filename,FNWindow,NULL,1);
  475. X                  OldSeconds=Seconds;  /*Store the time values*/
  476. X                  OldMicros=Micros; 
  477. X               }
  478. X            }
  479. X         }
  480. X      }
  481. X   return(GN_DONE);  /*All done...*/
  482. X}
  483. X
  484. Xvoid UpdateList(Pos,Num,header) /*Update filenames in the filename box*/
  485. XUSHORT Pos;                   /*According to the slider's position*/
  486. XUSHORT Num;
  487. Xstruct fibHeader *header;
  488. X{
  489. X   static USHORT LastFirstItem=30000;
  490. X   ULONG FirstItem;
  491. X   FirstItem=(((Pos+1)*(Num-10)) >> 16);
  492. X
  493. X   if( FirstItem != LastFirstItem)
  494. X      RewriteList(FirstItem,header);
  495. X   LastFirstItem=FirstItem;
  496. X}
  497. X
  498. Xvoid RewriteList(First,header)  /*Rewrite the list of filenames in the*/
  499. XUSHORT First;                 /*filename box...*/
  500. Xstruct fibHeader *header;
  501. X{
  502. X   register struct fibNode *node;
  503. X   register USHORT c,Y;
  504. X
  505. X   if(First)   /*If we're not starting at the start...*/
  506. X      for(c=0,node=(struct fibNode *)header->first;c < First;c++)
  507. X         node=(struct fibNode *)node->next; /*Get the first filename*/
  508. X   else     /*Otherwise, start at the top*/
  509. X      node=(struct fibNode *)header->first;
  510. X   header->top=(struct fibNode *)node;
  511. X   
  512. X   /*Print the filenames (up to 10)*/
  513. X   for(c=0,Y=YBorder;(c < 10) && (node!=NULL);
  514. X         c++,Y+=10,node=(struct fibNode *)node->next)
  515. X      PrintFileName(&(node->fib),Rp,XBorder,Y);
  516. X}
  517. X
  518. XBOOL CheckExt(name) /*Check to see if 'name' has the supplied extension*/
  519. Xchar *name;
  520. X{
  521. X   return(MatchPattern(MasterPattern,name));
  522. X}
  523. X
  524. XBYTE GetFib(header)
  525. Xstruct fibHeader *header;
  526. X{
  527. X   header->last=(struct fibNode *)header->current;
  528. X   if((header->current=(struct fibNode *) /*Allocate a FIB structure*/
  529. X         AllocMem(sizeof(struct fibNode),MEMF_PUBLIC|MEMF_CLEAR))==NULL)
  530. X      {
  531. X      FreeFuncMemory(header->current); /*Whoops, it didn't work...*/
  532. X      return(FALSE);
  533. X      }
  534. X   if(header->directory==NULL) /*Must want it for a directory...*/
  535. X      header->directory=(struct fibNode *)header->current;
  536. X   else  /*Append to the current FIB list*/
  537. X      {
  538. X      if(header->first==NULL)
  539. X         {
  540. X         header->directory->next=header->first=header->last=header->top=
  541. X               (struct fibNode *)header->current;
  542. X         CopyFIB(&(header->directory->fib),&(header->current->fib));
  543. X         }
  544. X      else
  545. X         {
  546. X         CopyFIB(&(header->last->fib),&(header->current->fib));
  547. X         header->last->next=(struct fibNode *)header->current;
  548. X         header->current->prev=(struct fibNode *)header->last;
  549. X         }
  550. X      }
  551. X   return(TRUE);
  552. X}
  553. X
  554. Xvoid CopyFIB(from,to) /*Copy a fileinfoblock from 'from' to 'to'*/
  555. Xstruct FileInfoBlock *from,*to;
  556. X{
  557. X   to->fib_DiskKey=from->fib_DiskKey;
  558. X   to->fib_DirEntryType=from->fib_DirEntryType;
  559. X   to->fib_Protection=from->fib_Protection;
  560. X   to->fib_EntryType=from->fib_EntryType;
  561. X   to->fib_Size=from->fib_Size;
  562. X   to->fib_NumBlocks=from->fib_NumBlocks;
  563. X   strcpy(to->fib_FileName,from->fib_FileName);
  564. X   strcpy(to->fib_Comment,from->fib_Comment);
  565. X   to->fib_Date.ds_Days=from->fib_Date.ds_Days;
  566. X   to->fib_Date.ds_Minute=from->fib_Date.ds_Minute;
  567. X   to->fib_Date.ds_Tick=from->fib_Date.ds_Tick;
  568. X}
  569. X
  570. Xvoid PrintFileName(fib,RPrt,X,Y)  /*Print a filename in the filename box*/
  571. Xstruct FileInfoBlock *fib;
  572. Xstruct RPort *RPrt;
  573. XUSHORT X,Y;
  574. X{
  575. X   UWORD len;
  576. X   char name[40];
  577. X   
  578. X   strcpy(name,fib->fib_FileName);
  579. X   if(fib->fib_DirEntryType > 0) /*Set the pen color, according to whether*/
  580. X   {        /*we're printing a filename or a directory name*/
  581. X      SetAPen(RPrt,yafr_e_DirnamePenColor); 
  582. X      strcat(name,"  (dir)"); /*Append '  (dir)' if it's a directory*/
  583. X   }
  584. X   else
  585. X      SetAPen(RPrt,yafr_e_FilenamePenColor);
  586. X   Move(RPrt,X,Y);
  587. X   Text(RPrt,"                         ",25);  /*Blank out the space*/
  588. X   Move(RPrt,X,Y);
  589. X   len = (strlen(fib->fib_FileName)<=25) ? strlen(fib->fib_FileName) : 25;
  590. X   Text(RPrt,fib->fib_FileName,len);   /*Trundicate the filename at 25 chars*/
  591. X                                       /*and print it.*/
  592. X}
  593. X
  594. Xvoid FreeFuncMemory(first)   /*Free the memory taken up by a fib list*/
  595. Xregister struct fibNode *first;
  596. X{
  597. X   register struct fibNode *next,*current;
  598. X   next=(struct fibNode *)first->next;
  599. X   FreeMem(first,sizeof(struct fibNode));
  600. X   while((current=(struct fibNode *)next)!=NULL)
  601. X      {
  602. X      next=(struct fibNode *)current->next;
  603. X      FreeMem(current,sizeof(struct fibNode));
  604. X      }
  605. X}
  606. X
  607. Xvoid PutDevicesInGadgets(Wdw,stat)
  608. Xstruct Window *Wdw;
  609. XULONG stat;
  610. X{
  611. X
  612. X   /*structure definitions*/
  613. X   struct RootNode *root;
  614. X   struct DosInfo *dosinfo;
  615. X   struct DeviceList *devlist;
  616. X   struct Gadget *button,*onbutton,*lastunghosted;
  617. X   UBYTE c=0;
  618. X   UBYTE old_c;
  619. X   
  620. X   char devname[35]; /*This is where the device name (DH0:, DF0:, etc.) will
  621. X                        end up*/
  622. X
  623. X   /*Get the first entry in the list of devices*/   
  624. X   root=(struct RootNode *)DOSBase->dl_Root;
  625. X   dosinfo=(struct DosInfo *)BADDR(root->rn_Info);
  626. X   devlist=(struct DeviceList *)BADDR(dosinfo->di_DevInfo);
  627. X
  628. X   /*Go through the linked list of devices*/
  629. X
  630. X   for(button=(struct Gadget *)&df0 ; c<10 && devlist ; devlist=
  631. X      (struct DeviceList *)BADDR(devlist->dl_Next))
  632. X
  633. X      if(devlist->dl_Type==DLT_DEVICE && devlist->dl_Task && 
  634. X          IsDOSDisk(devlist)) /*If it's a disk-type (RAM, hard, floppy) drive:*/
  635. X
  636. X      {
  637. X         bstrcpy(devname,(BPTR)devlist->dl_Name); /*Convert the BSTR to a*/
  638. X         strcat(devname,":");    /*regular string and add a ':'*/
  639. X         
  640. X          /*Devices with removable media must have the media inserted before*/
  641. X         /*they'll show up.  Of course, this is meaningless when talking*/
  642. X         /*about non-removable hard drives, RAM drives, etc.*/
  643. X     
  644. X          /*Copy the text to the Gadget text area*/
  645. X          strcpy(button->GadgetText->IText,devname);
  646. X         c++;
  647. X         lastunghosted=(struct Gadget *)button;
  648. X         button=(struct Gadget *)button->NextGadget;
  649. X      }
  650. X   if(Wdw!=NULL)
  651. X      SetAPen(Rp,0);
  652. X
  653. X      /*Clear & switch on gadgets that'll are in use now*/
  654. X   
  655. X   old_c=c;
  656. X   if(stat!=DISKREMOVED)
  657. X      if(FirstDisabled != NULL)
  658. X         for(onbutton=(struct Gadget *)FirstDisabled;button!=NULL && 
  659. X                  onbutton!=(struct Gadget *)button && 
  660. X                  onbutton!=(struct Gadget *)&pipe;
  661. X                  onbutton=(struct Gadget *)onbutton->NextGadget)
  662. X            if(Wdw == NULL)
  663. X               onbutton->Flags -= GADGDISABLED;
  664. X            else
  665. X            {
  666. X               RectFill(Rp,onbutton->LeftEdge,onbutton->TopEdge,
  667. X                     onbutton->LeftEdge+onbutton->Width-1,
  668. X                     onbutton->TopEdge+onbutton->Height-1);
  669. X               OnGadget(onbutton,Wdw,NULL);
  670. X            }
  671. X         
  672. X      
  673. X   FirstDisabled=(struct Gadget *)button; /*Store the first ghosted gadget*/
  674. X   
  675. X   if(stat!=DISKINSERTED)
  676. X      for(;c < 10 && !(button->Flags && GADGDISABLED);c++,
  677. X            button=(struct Gadget *)button->NextGadget)
  678. X      {  /*Clear out any unused gadget text & deactivate unused gadgets*/
  679. X         strcpy(button->GadgetText->IText,"    ");
  680. X         if(Wdw==NULL)
  681. X            button->Flags += GADGDISABLED;
  682. X         else
  683. X            OffGadget(button,Wdw,NULL);
  684. X      }
  685. X      
  686. X   if(Wdw != NULL)
  687. X      RefreshGList(&df0,Wdw,NULL,old_c); /*Refresh the gadgets*/
  688. X}
  689. X
  690. Xvoid ResetGadgets()
  691. X{
  692. X   struct Gadget *gadg;
  693. X   
  694. X   for(gadg=(struct Gadget *)&df0;gadg!=(struct Gadget *)&pipe;
  695. X         gadg=(struct Gadget *)gadg->NextGadget)
  696. X      gadg->Flags = NULL;
  697. X
  698. X}
  699. X
  700. Xvoid bstrcpy(dest,source)  /*Copy a BSTR to a regular string*/
  701. XBSTR source;
  702. Xchar *dest;
  703. X{
  704. X   register UBYTE *ch;
  705. X   register int len,i;
  706. X   
  707. X   ch=(UBYTE *)BADDR(source);
  708. X   len=(int) *(ch++);
  709. X   len=(len>20)?20:len;
  710. X   
  711. X   for (i=0;i<len;i++)
  712. X      dest[i]=*(ch++);
  713. X   dest[i]=NULL;
  714. X}
  715. X
  716. XBYTE IsDOSDisk(devlist)    /*Check to see if a device in a disk-type device*/
  717. Xstruct DeviceList *devlist;  /*(the sort of device that shows up when the*/
  718. X{                          /*AmigaDOS INFO command is run)*/
  719. X   struct MsgPort *port;
  720. X   BYTE result;            
  721. X   struct InfoData *info;  
  722. X   struct StandardPacket *diskpacket;
  723. X
  724. X      result=FALSE;  
  725. X   
  726. X   /*Allocate memory for the Port to use*/
  727. X   info=(struct InfoData *) AllocMem(sizeof(struct InfoData),
  728. X         MEMF_CLEAR|MEMF_PUBLIC);
  729. X   if(info==NULL)
  730. X      return(FALSE);
  731. X   
  732. X   diskpacket=(struct StandardPacket *) 
  733. X         AllocMem(sizeof(struct StandardPacket),MEMF_CLEAR|MEMF_PUBLIC);
  734. X   if(diskpacket==NULL)
  735. X   {
  736. X      FreeMem(info,sizeof(struct InfoData));
  737. X      return(FALSE);
  738. X   }
  739. X   
  740. X   /*Allocate the port*/
  741. X   port=(struct MsgPort *) CreatePort(NULL,0);
  742. X   if(port==NULL)
  743. X   {
  744. X      FreeMem(info,sizeof(struct InfoData));
  745. X      FreeMem(diskpacket,sizeof(struct StandardPacket));
  746. X      return(FALSE);
  747. X   }  
  748. X   
  749. X   /*Set up the message to send to the device*/
  750. X   diskpacket->sp_Msg.mn_Node.ln_Type=NT_MESSAGE;
  751. X   diskpacket->sp_Msg.mn_Node.ln_Name=(char *)&diskpacket->sp_Pkt;
  752. X   diskpacket->sp_Msg.mn_ReplyPort=port;
  753. X   diskpacket->sp_Pkt.dp_Link=&diskpacket->sp_Msg;
  754. X   diskpacket->sp_Pkt.dp_Type=ACTION_DISK_INFO;
  755. X   diskpacket->sp_Pkt.dp_Arg1=((LONG)info>>2);
  756. X   diskpacket->sp_Pkt.dp_Port=port;
  757. X   
  758. X   /*Send the message*/
  759. X   PutMsg(devlist->dl_Task,&diskpacket->sp_Msg);
  760. X   
  761. X   /*and wait for a reply...*/
  762. X   WaitPort(port);
  763. X   
  764. X   /*Store the result*/
  765. X   result=(info->id_DiskType==ID_DOS_DISK);
  766. X
  767. X   /*Deallocate resources*/
  768. X   DeletePort(port);
  769. X   FreeMem(info, sizeof(struct InfoData));
  770. X   FreeMem(diskpacket, sizeof(struct StandardPacket));
  771. X   
  772. X   /*And return the result*/
  773. X   return(result);
  774. X}
  775. X
  776. X
  777. X/*!*******************************************************************
  778. X * FindRoot by Bruce Rogers 1/20/90
  779. X *********************************************************************/
  780. X
  781. X/*!*******************************************************************
  782. X * Kludges disk:name/directory with filename so we can just read it.
  783. X *********************************************************************/
  784. Xvoid    DosConcatenate(string1,string2,result)
  785. Xchar    string1[],string2[],result[];
  786. X{
  787. Xshort   i,j;
  788. X
  789. X    for(i=0; string1[i] != '\0'; i++)
  790. X        result[i]=string1[i];
  791. X    if ((result[i-1] != ':') && (result[i-1] != '/') && (i!=0) && string2[0]!=0)
  792. X    {
  793. X        result[i]='/';
  794. X        ++i;
  795. X    }
  796. X    for(j=0; string2[j] != '\0'; j++)
  797. X        result[i+j] = string2[j];
  798. X    result[i+j] = '\0';
  799. X}
  800. X
  801. X/*!*******************************************************************
  802. X * Recursively go up parent chain, looking for oldest parent.
  803. X * Create the absolute path string as we go.
  804. X *********************************************************************/
  805. XSeekRoot(oldlock)
  806. XULONG   oldlock;
  807. X{
  808. Xshort   i;
  809. XULONG   newlock;
  810. Xstruct  FileInfoBlock *fileInfo;
  811. X
  812. X    fileInfo=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),
  813. X          MEMF_CLEAR);
  814. X    if(fileInfo==NULL)
  815. X       return(FALSE);
  816. X    Examine(oldlock,fileInfo);
  817. X    DosConcatenate(fileInfo->fib_FileName,absDirName,absDir);
  818. X    for(i=0;i<MAXPATHSTRING;i++) absDirName[i]=absDir[i];
  819. X    newlock=ParentDir(oldlock);
  820. X    UnLock(oldlock);
  821. X    oldlock=newlock;
  822. X    if (oldlock!=NULL) SeekRoot(oldlock);
  823. X    FreeMem(fileInfo,sizeof(struct FileInfoBlock));
  824. X
  825. X}
  826. X
  827. X/*!*******************************************************************
  828. X * Given a path, sets absDirName equal to the absolute path
  829. X *********************************************************************/
  830. X        MakeAbsName(dirName)
  831. Xchar    *dirName;
  832. X{
  833. Xshort   i;
  834. XULONG   lock;
  835. X
  836. X    for(i=0;i<MAXPATHSTRING;i++) absDirName[i]=absDir[i]=0;
  837. X    lock=Lock(dirName,ACCESS_READ);
  838. X    if (lock==NULL)
  839. X      return(NULL);
  840. X    SeekRoot(lock);
  841. X    for(i=0;i<MAXPATHSTRING;i++)
  842. X    {
  843. X        if (absDirName[i]=='/')
  844. X        {
  845. X            absDirName[i]=':';
  846. X            break;
  847. X        }
  848. X    }
  849. X}
  850. X
  851. X/*End of YAFR.c*/
  852. END_OF_FILE
  853. if test 29701 -ne `wc -c <'YAFR.c'`; then
  854.     echo shar: \"'YAFR.c'\" unpacked with wrong size!
  855. fi
  856. # end of 'YAFR.c'
  857. fi
  858. if test -f 'yftest.uu' -a "${1}" != "-c" ; then 
  859.   echo shar: Will not clobber existing file \"'yftest.uu'\"
  860. else
  861. echo shar: Extracting \"'yftest.uu'\" \(22833 characters\)
  862. sed "s/^X//" >'yftest.uu' <<'END_OF_FILE'
  863. Xbegin 664 yftest
  864. XM```#\P`````````)``````````@```/9````/P``!E]````R```$CP```!\`K
  865. XM```Q````'````#P```/I```#V4CG?OXD2"0`2?D`````+'@`!$?Y```+U'(`'
  866. XM(#P```&:8`(FP5'(__PI3PP4*4X,#$*L#!!P`"(\```P`$ZN_LY#^@%:<`!.A
  867. XMKOW8*4`19&8&<&1@``#\)FX!%"EK`)@,"$JK`*QG:"`/D*\`!`:`````@"E`W
  868. XM"]@@:P"LT<C1R")H`!#3R=/)(`)R`!(9*4D,'-"!4H!"9U*``D#__I_`58!"*
  869. XM=P@`(`)3@-2!'[(``"``4X)1R/_V'[P`("``4X(?L2``(`!1RO_X(D\O"6!RJ
  870. XM*6L`.@O8<']2@-&L"]A!ZP!<3J[^@$'K`%Q.KOZ,*4`,$"\`)$`@*@`D9Q(L-
  871. XM;!%D($`B*```*4$,"$ZN_X(B*@`@9QHD/````^U.KO_B*4`,&&<*Y8@@0"=HZ
  872. XM``@`I"!L#!`O"$AL"]0@:``D*6@`!`P<3KH`9DZZ"`9P`&`$("\`!"\`("P,Y
  873. XM`&<$($!.D$ZZ!NXL>``$(FP19$ZN_F).N@`\2JP,$&<:(BP,&&<$3J[_W"QX;
  874. XM``1.KO]\(FP,$$ZN_H8@'RYL#!1,WW]^3G5D;W,N;&EB<F%R>0!.=4YU+FP,>
  875. XM%$ZZ"W9(>0```!1.N@,T``````````!P82`O``0,``!A;0H,``!Z;@0$```@5
  876. XM3G4``$CG(#`F;P`0)$M*$F<D<``0$D'L"D4(,``!"`!G"G(`$@!T()*"8`1R_
  877. XM`!(`%(%2BF#8(`M,WPP$3G4``````````'!A3E7__$CG`S`F;P`<)&\`("XOV
  878. XM`"1*AV<V2A-G,DH29RYP`!`;+P!.NO]\<@`2&BZ!+T``%$ZZ_VY83R(O`!"2E
  879. XM@"P!2H9G!"`&8!I3AV#&2H=G$$H39P1P`6`*2A)G!'#_8`)P`$S?#,!.74YU@
  880. XM3E7_^$CG`S`F;P`@)&\`)"XO`"@@2DH89OQ3B)'*+`@@2TH89OQ3B)'+(`@BU
  881. XM2]/`*TG_^+R'8P(L!R`&($I@`A+84X!D^B!M__A",&@`(`M,WPS`3EU.=2)OP
  882. XM``@@;P`$(`A*&&;\4X@0V6;\3G4``$CG`1`F;P`,+B\`$'``$!.PAV8$(`M@]
  883. XM"!`;2@!F[G``3-\(@$YU2.<!$"9O``PN+P`0+P<O"V'(4$],WPB`3G5(YP$P3
  884. XM)F\`$"XO`!25RDH39PYP`!`3L(=F`B1+4HM@[B`*3-\,@$YU(&\`!"`O``AO0
  885. XM"B(O``P0P5.`9OI.=0``(&\`!$CH_OX`!"%O`````'``3G4@+P`(9@)2@"!O4
  886. XM``1,Z/[^``0O:`````!.=0``2.</$"XO`!@L+P`<*B\`("\'3KH$/%A/)D`@P
  887. XM"V8$</]@'B\%+P8O*P`$3KH!U$_O``PH`$JL"^QG!'#_8`(@!$S?"/!.=0``K
  888. XM````````<&%(YP,P+B\`%$J';@9P`&```*1P"+Z`9`(N`"`'5H`N``)'__Q%;
  889. XM[`G,)E(@"V=`("L`!+"';3*PAV8,(%,DB)^L"=`@"V!N("L`!)"'<@BP@646A
  890. XM($O1QR2()$@DDR5```2?K`G0(`M@3"1+)E-@O"`'(BP*0-"!4X!.N@(R(BP*Q
  891. XM0$ZZ`@HL`%"&(`96@"P``D;__"\&3KH#YEA/)D`@"V<2+P8O"TZZ!T(NAV$`N
  892. XM_U103V`"<`!,WPS`3G4``````````````````"\+)F\`""`+9Q!"ITZZ"`)8*
  893. XM3R!+68@I2!(X<``F7TYU````````<&%(YP,0+B\`$$?L"=0@"V<T""L``@`;T
  894. XM9B@(*P`!`!MG("`K``20JP`0+`!*AF<2+P8O*P`0+RL`'$ZZ`\)/[P`,)E-@X
  895. XMR"\'3KH&3%A/3-\(P$YU``````````!P84CG-Q`N+P`<)F\`("PO`"1*K`P$O
  896. XM9P1.N@FT0JP+["(')`LF!BQL$61.KO_0*@!P_[J`9@Y.KO]\*4`+['`%*4`1^
  897. XM8"`%3-\([$YU``````````````````````````````````!(YS\`+B\`'"POI
  898. XM`"`J+P`D2JP,!&<$3KH)4$*L"^P@!5.`(@<D!B8`+&P19$ZN_[XH`'#_N(!F`
  899. XM#DZN_WPI0`OL<!8I0!%@(`4,@`````)G%@R``````6<(2H!F&"`&8!0@!-"&-
  900. XM8`XB!W0`=@`L;!%D3J[_ODS?`/Q.=0``2.<`$B9O``Q*JP`*9PHB2RQX``1.F
  901. XMKOZ8%WP`_P`(</\G0``4<``0*P`/+'@`!$ZN_K`B2W`B3J[_+DS?2`!.=2\'H
  902. XM+B\`"$JL#`1G!$ZZ")XB!RQL$61.KO_<<``N'TYU2.<P`"0`)@%(0DA#Q,'&;
  903. XMP,#!U$-(0D)"T(),WP`,3G5*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```80
  904. XM1(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$W
  905. XMP3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF9H
  906. XM64,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(J
  907. XM0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,%!)A\D'TYU2.<#,B9O`!@N+P`<]
  908. XM</\L>``$3J[^MBP`#`8`_V8$<`!@9G`B(CP``0`!3J[_.B1`(`IF"G``$`9.=
  909. XMKOZP8$@E2P`*(`<50``)%7P`!``(0BH`#A5&``^3R4ZN_MHE0``0(`MG"")*O
  910. XM3J[^GF`:0>H`&"5(`!1!Z@`4)4@`'$*J`!@5?``"`"`@"DS?3,!.=0``+P<N=
  911. XM+P`(<``I0`OL2H=K(KZL";QL'"`'YX!![!`@2K`(`&<.(`?G@$'L$"#1P"`(B
  912. XM8`AP"2E`$6!P`"X?3G4``````````````````$CG`#(F;!%H(`MG%"13(DL@1
  913. XM*P`(+'@`!$ZN_RXF2F#HD<@I2!%L*4@1:$S?3`!.=4CG`3(N+P`4<`S>@"`'[
  914. XM<@`L>``$3J[_.B9`(`MF!'``8#HG1P`(1>P1:"!J``0G2``$D<@FB$J29@(DD
  915. XMBTJJ``1G!B)J``0BBR5+``1*K`G`9@0I2PG`0>L`#"`(3-],@$YU````````A
  916. XM``````````!(YP<P+B\`&"9O`!PL+P`@+P=.NO\`6$\D0"`*9@1P_V`V""H`:
  917. XM`P`#9Q!(>``"0J<O!TZZ^I!/[P`,+P8O"R\J``1.NOP<3^\`#"H`2JP+[&<$R
  918. XM</]@`B`%3-\,X$YU``!.5?_P2.<A,B9O`"P,K````"`1KFP``(80$W(@L`%G[
  919. XM#'()L`%G!G(*L`%F!%*+8.A*$V=H("P1KN6`4JP1KD'L$;;1P"1(<"*P$V8F,
  920. XM4HLDBTH39PIP(K`39P12BV#R2A-F#$AX``%.N@'06$]@GD(;8)HDBTH39Q@0)
  921. XM$W(@L`%G$'()L`%G"G(*L`%G!%*+8.1*$V8"8`9"&V``_W)*K!&N9@8@;`P0%
  922. XM8`1![!&V*4@1LDJL$:YF?$/Z`21-[!%T+-DLV2S9+-D\D2)L#!`@:0`D2'@`[
  923. XM*"\H``1(;!%T3KKX9D_O``PL;!%D0>P1="(()#P```/N3J[_XBE`$"0I0!`L%
  924. XM<A`I01`H*4`0-"E!$##E@"M`__`L>``$D\E.KO[:(&W_\")`(V@`"`"D?@`K0
  925. XM0/_T8"HL;!%D3J[_RBE`$"1.KO_$*4`0+$'Z`*8B""0\```#[4ZN_^(I0!`TU
  926. XM?A`@!P!`@`&!K!`@(`<`0(`"@:P0*`"L``"``Q`P2JP*/&<$<`!@!B`\``"`I
  927. XM`"X`0JP)\"`'`$```2E`">QP`2E`"A(@!P!```(I0`H.<`(I0`HT(`<`0`"`[
  928. XM*4`*,$'Z`MHI2`P$+RP1LB\L$:Y.N@`F0I=.NOG43.U,A/_<3EU.=6-O;CHQ,
  929. XM,"\Q,"\S,C`O.#`O`"H`3OD`````````````````````<&%(YS`R+&\`."!O_
  930. XM`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?3`Q.=0``2.<'+
  931. XM`"XO`!`@+`F\4X`L`$I&:S`@!DC`YX!![!`@*C`(`$H%9QH(!0`$9A0@!DC`%
  932. XMYX!![!`@+S`(!$ZZ^JQ83U-&8,PO!TZZ]8!83TS?`.!.=0``(F\`""!O``0@]
  933. XM"1#99OQ.=4Y5_^A(YP$R+B\`-$J';@9P_V```-)P"+Z`9`(N`"`'5H`N``)'X
  934. XM__PD;0`(("T`"-"'WZP)T$'L"<PF4"M`__`K2/_T(`MG``"0($L@*P`$T<`KT
  935. XM2/_L(FW_\+?)8Q`DBR5'``0L;?_T+(IP`&!XM\EF&BQ3)(X@*P`$(@#2AR5!N
  936. XM``0L;?_T+(IP`&!:M<AD")^L"=!P_V!.M<AF+$J39PX@4[/(8PB?K`G0</]@'
  937. XM.-^K``1*DV<.L]-F"B`I``31JP`$)I%P`&`>*TO_]"MM_^S_Z"938`#_;B!MF
  938. XM__0@BD*2)4<`!'``3-],@$Y=3G4``$CG`3`N+P`02JP2.&<6)&P2."\2+RP2(
  939. XM.$ZZ_O903Y'(*4@2.$J'9@1P`&`>6(<O!TZZ]O983R9`2H!F!'``8`HD2R2'.
  940. XM0>L`!"`(3-\,@$YU3E7_J$CG`0(L>``$0_H`CG``3J[]V"M`_ZAF"DAX`!1.F
  941. XMNOXZ6$]^`"!L#!P>*/__(`=#[?^P8`(2V%.`9/I"-7BP0>W_L"E("U0O+?^HA
  942. XM2'@`*$AX`/IP`"\`+P!(;`MP<@`O`4AL"UPO`4ZZ_;Q(>``43KK]Z$SM0(#_&
  943. XMH$Y=3G4J*B!3=&%C:R!/=F5R9FQO=R`J*@``15A)5```:6YT=6ET:6]N+FQI`
  944. XM8G)A<GD```````````!P84Y5_YA(YS,"?@`@;`P<'BC__W!/OH!O`BX`(`=#+
  945. XM[?^O8`(2V%.`9/I"-7BO+'@`!)/)3J[^VBM`_Z8@0$JH`*QG4B(H`*SE@2)!4
  946. XM+"D`.$CM``+_GDJ&9@0L*`"@2H9G-"QL$60B!D'Z`+(D"'8+3J[_T"!'4H<@T
  947. XM"!N\``H(KRQL$60B!B8'0>W_KR0(3J[_T'#_8%(L>``$0_H`C'``3J[]V"M`3
  948. XM_YIF!'#_8#I![?^O*4@+I"\M_YI(>``\2'@`^G``+P`O`$AL"\!(;`NL2&P+J
  949. XMF$*G3KK\FD_O`"13@&<$</]@`G``3-]`S$Y=3G4J*B!5<V5R($%B;W)T(%)EG
  950. XM<75E<W1E9"`J*@``0T].5$E.544``$%"3U)4`"HJ*B!"<F5A:SH@`&EN='5I2
  951. XM=&EO;BYL:6)R87)Y`$CG`0(L>``$<``B/```,`!.KO[.+@`"AP``,`!*AV<@\
  952. XM2JP,!&<:(&P,!$Z02H!F`F`.0JP,!$AX`!1.NOPP6$],WT"`3G5AN$YU````8
  953. XM``/L`````0````$```L^`````@````0````4````"@````````/R```#Z0``_
  954. XM`#].5?Y\O^P+V&4``,XO!V$``%A"+?_?2&P``$AM_TE.N@#62&P`!DAM_S=.;
  955. XMN@#*<`$N@$AX``,O`'(`+P%(;``(2'@`"DAX`"`O`4AM_S=(;?])2&W_WTZZ0
  956. XM`)(N`&$``%@N+?YX3EU.=;_L"]AE``!J0J=(;``:3KH`9E!/*4`,($J`9@I(P
  957. XM>``*3KH`6EA/0J=(;``L3KH`2%!/*4`,)$J`9A(O+`P@3KH`2$AX`!1.N@`T%
  958. XM4$].=;_L"]AE```<+RP,)$ZZ`"PNK`P@3KH`)$*73KH`$EA/3G5.^0```:Q.!
  959. XM^0```*Q.^0``!/!.^0``!E1.^0```)A.^0``"]@```/L`````P````````#FB
  960. XM````^````-H````!`````@```.P````"````!@```/(```#@`````````_(`0
  961. XM``/I```&7TY5__R_[`O890`8F"\'+BT`""\'3KH8GEA/*T#__$J`9@Y(>/__H
  962. XM2&P/WDZZ&1A03T*G+P<O+?_\3KH8^"`M__PN+?_X3EU.=;_L"]AE`!A4+PLF.
  963. XM;P`(+PM.NAB<6$\F7TYUO^P+V&4`&#I(YP$0)F\`#'X!2A-G(!`32(`$0``H\
  964. XM9P930&<&8`Q21V`(4T=F!"`+8`92BV#<<`!,WPB`3G5.5?_@O^P+V&4`%_A(Z
  965. XMYP<0)FT`"$*M__A^`"!+2AAF_%.(D<L@"%*`.T#_\"(+9@9P`&```JHP+?_PH
  966. XM2,!R!DZZ&$8O`&$`_QI83RM`__P0&QM`_^]G``(R&U/_[A(`2($$00`C9P``P
  967. XML%5!9P`!5E=!9QA306<``EP$00`69P`!,`1!`#UG:&```4X0+?_N<GRP`6<`7
  968. XM`CYR*;`!9P`"-B`'P?P`!B!M__P1O``%"`0@2R\(*TC_ZF$`_PI83R9`(`MG"
  969. XM``(00AL@!\'\``8O+?_J+T``%&$`_RI83R!M__PB+P`0(8`8`&8``9I@``'F\
  970. XM$"W_[G)\L`%G``':<BFP`6<``=(@!\'\``8@;?_\$;P``0@$8``!;A`M_^YR(
  971. XM([`!9P`!LG)\L`%G``&J<BFP`6<``:)*`&<``9PB!\/\``8@;?_\$;P``A@$D
  972. XM$@!(@01!`"5G``$P54%G$%-!9P`!)@1!`!=G``$>8`0;6__N4D<@!W(&P<$@/
  973. XM;?_\0C`(!"`'P<%(>``"+T``%&$`_=983R!M__PB+P`0(8`8`"`'P?P`!B!P+
  974. XM"``0K?_N4HM@``#6(`?!_``&(&W__!&\``,(!&```,(@!\'\``8@;?_\$;P`T
  975. XM!`@$8```KB`'P?P`!B!M__Q",`@$($M*&&;\4XB1RR`(5(`J`"`%2,`O`&$`7
  976. XM_6183R!`$*W_[WP!*T#_YDH39RP0$TB`2,`O`$AL"0Q.NA7\4$]*@&86<">P`
  977. XM$V8"4HL@!E)&(&W_YA&;``!@T"!M_^9",&``(`?!_``&(@9(P5*!+P$O0``4)
  978. XM80#]""!M__PB+P`4(8`8`"!M_^8B0!+89OP@0"Z(3KH5VBZM_^9A`/TJ6$]2Z
  979. XM1V``_<@@!U)'P?P`!B!M__P1O``&"`0@!TC`<@9.NA7D+P!A`/RX6$\B!TC!;
  980. XM+T``$'`&3KH5SB!M__PB;P`08`(2V%.`9/H@;P`0*TC_^"\M__QA`/S0("W_?
  981. XM^$SM".#_T$Y=3G5.5?_XO^P+V&4`%1!(YP,P)FT`""1M``P@;0`02AAF_%.(>
  982. XMD>T`$"`(4H`L`"!M`!!*&&;\4XB1[0`0(`A2@"\`80#\-EA/?@`K0/_XOD9LQ
  983. XM0B\M__@O"R!M`!1.D%!/2D!G'"\M`!`O"F$``2Y03TI`9PPO+?_X80#\2'`!T
  984. XM8!X@;0`0(FW_^!.8<``K2``04D=@NB\M__AA`/PH<`!,[0S`_^A.74YU3E7_V
  985. XM_+_L"]AE`!1J2.<`,"9M``@D;0`,*TO__%R+(&W__!`H``1(@`Q```=D``"R1
  986. XMT$`P.P`&3OL`!``,`*0`I`!4`*0`?@"D+PHO"V$``7A03TI`9P9P`6```(XB@
  987. XM;?_\(%%*&&;\4XB1T2\(+Q$O"DZZ%'I/[P`,2H!F9")M__P@44H89OQ3B)'1Z
  988. XM(`C5P&"X+PHO"V$``3!03TI`9P1P`6!&4HI*$F;H$"L`!'(&L`%G!%,`9BIPQ
  989. XM`6`N+PHO"V$``0903TI`9P1P`6`<2'K_,B\*+PL@;?_\+Q!A`/Y^8`@O"B\+0
  990. XM80``#$SM#`#_]$Y=3G6_[`O890`3?$CG`#`F;P`,)&\`$"`*9@9P`&```+(0@
  991. XM*P`$<@:P`6<``)QR`;`!9P``E!(`2($,00`&9```@M)!,CL0!D[[$`0`"@!T_
  992. XM`#H`2`!T`%P@4TH89OQ3B)'3+P@O$R\*3KH3E$_O``Q*@&<$<`!@6B!32AAF-
  993. XM_%.(D=,@"-7`8#I<BR\*+PMA`/Z"4$]@/$H25\!$`$B`2,!2BDJ`9QQP`&`HP
  994. XM0>L`!DAZ`"@O"B\(+Q-A`/VR3^\`$&`07(M@`/]<2A)F!'`!8`)P`$S?#`!.,
  995. XM=;_L"]AE`!*H2.<`,"9O``PD;P`0(`IF!'``8#X@"V<X<`:P*P`$9S`O"B\+0
  996. XM80#^_E!/2D!G!'`!8"`0*P`$<@&P`6<(70!G!%R+8.YP`;`K``1FR%R+8,1PJ
  997. XM`$S?#`!.=4Y5_V"_[`O890`21$CG!S`F;0`()&T`##XM`!H\+0`>.BT`*G`!Q
  998. XM*T#__$HM`#-G#C`L`,X`0`"`.4``SF`&.7P`!@#..44.PCEM`"X.Q$AX__XO%
  999. XM"DZZ$H)03RM`__@@;0`02A!F#$'L"10B;0`0$MAF_"!M`!!#[?]B$MAF_$AMT
  1000. XM_V)A`/G(6$\I0!`:($I#[`XL$MAF_"!M`!!#[`V6$MAF_"!+0^P-=1+89OP@?
  1001. XM!SE`"-@@!CE`"-HI;0`@"/(@;0`D*4@(]B`(9P1P#V`"<`$Y0`D&<``O`"\`L
  1002. XM80`,-DAL"-A.NA&F3^\`#"E``$!*@&8.+RW_^$ZZ$<)P`&```:9(;`D82'C_@
  1003. XM_R\L`$!.NA%&2'@``2!L`$`O*``R3KH18$AX`!-(>``&(&P`0"\H`#).NA%`/
  1004. XM2'@`"4AL"4(@;`!`+R@`,DZZ$;Q(>`":2'@`!B!L`$`O*``R3KH1&$AX``=(G
  1005. XM;`E,(&P`0"\H`#).NA&43^\`1$AX`*5(>``&(&P`0"\H`#).NA#L2'@`"$AL%
  1006. XM"50@;`!`+R@`,DZZ$6A"ER\L`$!(;`@\3KH18$_O`"`O+?_X80``^EA/*T#_U
  1007. XM_%.`9CXO+?_X3KH0]$AX``%"IR\L`$!(;`@\3KH0@DAX__Y(;`XL3KH0]$*7Y
  1008. XM+RP`0$AL`38K0/_X3KH1$D_O`"1@L"\M__A.NA"V6$]*K?_\9P``AD'L#74B]
  1009. XM2Q+89OQ![`XL(DH2V&;\0>P-EB)M`!`2V&;\2JT`%&=>0>P.+")M`!02V&;\7
  1010. XM($I*&&;\4XB1RG`Z(@BP,AC_9S`@2DH89OQ3B)'*(`AG(B!*2AAF_%.(D<IPQ
  1011. XM+R((L#(8_V<.2&P)7B\M`!1.NA!*4$](;`UU+RT`%$ZZ$#Q03R\L`$!.NA!B!
  1012. XM80`,;"`M__Q,[0S@_TQ.74YU3E7_U+_L"]AE``^62.</,B9M``AX`)'(*TC_;
  1013. XMY"M(_^A(;?_D80`($%A/2@!F!G``8``"(D)L`$A(;`!N2&P`1$AX``%A``.`5
  1014. XM80`"7$AX``5(;`E@2&P.+$ZZ#[Y/[P`82H!G``%\(`MG``%V(&W_\"\(+PM.L
  1015. XMN@_`2&W_Y&$`![A/[P`,2@!F!G``8``!R"!M__`O""\+3KH/8E!/+@`@!TJ`^
  1016. XM9P``_"!M__!0B"\(80`':%A/2D!F#"!M__`@*``$2H!O%B!M__!0B"\(80`!E
  1017. XMD%A/2H!G!'(!8`)R`"P!(`9*@&=&<`JX0&0H(&W_\"($4D3"P'`MTH`O`4AX4
  1018. XM``@B;`!`+RD`,B\(80`(,$_O`!!@&%)$<``P!$AL`&Y(;`!$+P!A``*B3^\`\
  1019. XM#'``,`1(;?_D+P!A``+<4$\J`'`&NH!G0G`$NH!F*$AL#BQA``&@2'@``4*GN
  1020. XM+RP`0$AL"#Q.N@Y,+JW_Y&$`"+1P`6```.9P!+J`;+0O+?_D80`(H"`%8```B
  1021. XMTDJ&9P#_!DAM_^1A``:F6$]*`&8`_O9P`&```+8B;?_P(&D!")7*(4H!!"!MP
  1022. XM__`L;?_D(FX!!+/(9A0K2O_T*TK_["M*_^@@;?_D(4H!!$AX`1`O+?_P3KH.K
  1023. XM!E!/(FP`0"!I`%9P`!`H``]R`>&A+P%.N@Y&6$]P`#`$2&W_Y"\`80`"#%!/J
  1024. XM*@!P!KJ`9\YP!+J`9BQ(;`XL80``T%A/2@!G'DAX``%"IR\L`$!(;`@\3KH-V
  1025. XM=BZM_^1A``?><`%@$'`$NH!LL"\M_^1A``?,(`5,[4SP_[A.74YUO^P+V&4`*
  1026. XM#3PO"R9O``@P+`#."```!V8$<`%@*"!+2AAF_%.(D<L@"")+T\!;B4'L"680:
  1027. XM&;`89@1*`&;V5L!$`$B`2,`F7TYUO^P+V&4`#/1"IR!L`$`O*``R3KH-%DAX_
  1028. XM`(U(>`#02'@`)TAX``@@;`!`+R@`,DZZ#3Q(>``!(&P`0"\H`#).N@SJ3^\`$
  1029. XM)$YUO^P+V&4`#*Q(YP,0)F\`$$H39A!![`EL(DL2V&;\<`%@``"P?@!\`4HS@
  1030. XM>`!G&$J&9Q1R+[(S>`!7P$0`2(!(P"P`4H=@XDJ&9Q!(;`EN+PM.N@S>4$]P?
  1031. XM`6!X($M*&&;\4XB1RW`Z(@BP,QC_9@1P`&!@?``@2TH89OQ3B)'+(`@N`%.'Y
  1032. XM2H=K.G`OL#-X`&8>2H=G!K`S>/]F"'``%X!X`6`&<``7@'@`?@!\`6`0<#JPD
  1033. XM,W@`9@A",W@!?@!\`5.'8,)*AF8*0>P)<")+$MAF_'`!3-\(P$YU3E7__+_L-
  1034. XM"]AE``O02.<!,#XO`!HF;P`<)&\`('``,`<O0``,(#P`"?_V(B\`#$ZZ"\@W9
  1035. XM0``(0J<O+`!`+PI.N@O$3.T,@/_P3EU.=4Y5_TB_[`O890`+A$CG!S`^+0`*%
  1036. XM)FT`#"!L`$`O*`!63KH+M%A/*T#_]DJ`9P`##B!`*V@`'/_R.V@`(/_B.V@`O
  1037. XM(O_@*V@`%/_N.V@`&/_D*V@`)/_J*V@`*/_F+P!.N@LH6$\@+?_N<A"0@6<D<
  1038. XM<A"0@6<``7IR()"!9S@$@```?\!G``%"!(```(``9P`!3&"&<`J^0&.`<``P]
  1039. XM+`!(<@`R!R\++P$O`&$``IY/[P`,8`#_9B!M__(,:``*`"9B=B!H`!I(>``%I
  1040. XM2&P)>B\H``Q.N@LT3^\`#$J`9RXB;?_R(&D`&B\H``QA``H<0>P/4D/L#BP2@
  1041. XMV&;\2&P)@$AL#BQ.N@L*3^\`#&`4(FW_\B!I`!HB:``,1>P.+!399OQ(>``!T
  1042. XM0J<O+`!`2&P(/$ZZ"FQP`6```@H@;?_R,"@`)@1```MM?`Q```AL=M!`,#L`\
  1043. XM!D[[``0`9``4`!0`#@`:`&H`:@`@<`!@``'6<`-@``'0<`1@``'*$"P-EDH`.
  1044. XM9B)![`F"0^P-EC+00A%(>``!0J<O+`!`2&P!JDZZ"@!/[P`00>P-ED/M_TH2&
  1045. XMV&;\2&W_2F$`\=I83RE`$!IP`6```8!P!6```7HO/```@``O+`!`80`$@'`%@
  1046. XM8``!9B\\``$``"\L`$!A``1L<`5@``%2<!(@;?_RL&@`)F8&<`%@``%`2'@`#
  1047. XM!4AL"89(;`XL3KH)^$_O``Q*@&<`_@`P+?_@2,!R)I"!<@I.N@F$*@!\`"MKR
  1048. XM`!#__+P%9Q1*K?_\9PX@;?_\*V@!!/_\4@9@Z$JM__QG`/W&(&W__"`H``1*C
  1049. XM@&]T0^P.+"1)2AIF_%.*E<EP.D/L#BLB"K`Q&`!G,D/L#BPD24H:9OQ3BI7)A
  1050. XM<"]#[`XK(@JP,1@`9Q80+`XL2@!G#DAL"8Q(;`XL3KH)8E!/(&W__%"(+PA(&
  1051. XM;`XL3KH)4$AX``%"IR\L`$!(;`@\3KH(S'`!8&I#Z``(0>P-=1`8L!EF)DH`$
  1052. XM9O9F("\M_^8O+?_J+RP)=B\L"7).N@D\3^\`$$J`9P1P`V`V(&W__%"(0^P--
  1053. XM=1+89OQ(>``!0J<O+`!`2&P!-DZZ"'1/[P`0*6W_Z@ER*6W_Y@EV8`#\WG`&G
  1054. XM3.T,X/\T3EU.=;_L"]AE``A`2.<G$#XO`!H\+P`>)F\`('``,`=R`#(&=`J2-
  1055. XM@E*`3KH(Y$A`2,`J`'``,"P)CK"%9PHO"R\%80``$%!/(`4Y0`F.3-\(Y$YU8
  1056. XMO^P+V&4`!_!(YP<P/B\`&B9O`!Q*1V<2?``D:P`$O$=D#"1J`0121F#T)&L`B
  1057. XM!"=*`!!\`'HM<`J\0&0L(`IG*'``,`4O`$AX``@@;`!`+R@`,B\*80`!.D_OK
  1058. XM`!!21@9%``HD:@$$8,Y,WPS@3G6_[`O890`'@B\+)F\`""\++RP0&F$`],103
  1059. XM3R9?3G6_[`O890`'9"\+)F\`""=K``P`""\\``$``4AX`1!.N@@64$\G0``,H
  1060. XM2H!F#"\`80`!MEA/<`!@9$J39@@@:P`,)HA@5DJK``1F*"!3(FL`#"=)`!`G>
  1061. XM20`()TD`!"%)`00@4R)K``PO"2\(80``-%!/8"@@:P`((FL`#"\)+PAA```@'
  1062. XM4$\@:P`((FL`#"%)`00@:P`,(6L`"`$(<`$F7TYUO^P+V&4`!L1(YP`P)F\`8
  1063. XM#"1O`!`DDR5K``0`!"5K`'0`="5K`'@`>"5K`'P`?"5K`(``@$'J``A#ZP`(W
  1064. XM$-EF_$'J`)!#ZP"0$-EF_"5K`(0`A"5K`(@`B"5K`(P`C$S?#`!.=4Y5_]2_>
  1065. XM[`O890`&7$CG!S`F;0`()&T`##XM`!(\+0`60>L`"$/M_]82V&;\("L`!$J`.
  1066. XM;R!P`#`L#L0O`"\*3KH&5DAL"9!(;?_63KH&F$_O`!!@$'``,"P.PB\`+PI.&
  1067. XMN@8V4$]P`#`'<@`R!B\!+P`O"DZZ!A9(>``92&P)F"\*3KH&F'``,`=R`#(&`
  1068. XM+H$O`"\*3KH%]D_O`"!!ZP`((DA*&6;\4XF3R"`)<AFP@6X20>L`"")(2AEF>
  1069. XM_%.)D\@@"6`"(`$J`$'K``AP`#`%+P`O""\*3KH&1$SM#.#_P$Y=3G5.5?_X_
  1070. XMO^P+V&4`!7I(YP`P)FT`""1K`01(>`$0+PM.N@6F4$\@2BM(__@@"&<2)&@!?
  1071. XM!$AX`1`O"$ZZ!8Q03V#D3-\,`$Y=3G5.5?_`O^P+V&4`!3)(YS\R)FT`""XM/
  1072. XM``Q\`"!L$60K:``B__P@;?_\("@`&.6`($`B*``$Y8%#[`=X*T#_^"M!__0KT
  1073. XM2?_P<`J\`&1T2JW_]&=N(&W_]$JH``1F5DJH``AG4"\(80`"!EA/2@!G1"!MQ
  1074. XM__0O*``H2&W_PV$``:Y(;`FR2&W_PTZZ!3)/[P`0(FW_\"!I`!I%[?_#+&@`5
  1075. XM#!S:9OQ2!BMM__#_Z"!M__`K4/_P(&W_]"`0Y8`K0/_T8(8@"V<00J<@;`!``
  1076. XM+R@`,DZZ!)Q03RH&#(<``0``9P``D$JL"0AG``"(*VP)"/_L2JW_\&=Z(&W_G
  1077. XM[")M__"SR&=N0^P#5+')9V8@"V8(!&@!```,8%`P*``$2,`R*``&2,$T*``$V
  1078. XM2,(V*``(2,/4@U."-B@`!DC#."@`"DC$UH13@R\#+P(O`2\`(&P`0"\H`#).A
  1079. XMN@1<0I<O"R\M_^Q.N@2>3^\`'"!M_^PK4/_L8(`I;?_P"0@,AP``@`!G6G`*:
  1080. XMO`!D5"!M__!*:``,9PH@/````0!*@&9`(FW_\"!I`!I%[`FT+&@`#!S:9OP@3
  1081. XM"V8,(&W_\`9H`0``#&`00J<O"R\M__!.N@1*3^\`#%(&(&W_\"M0__!@IB`+A
  1082. XM9Q9P`!`%+P!"IR\+2&P'>$ZZ`UY/[P`03-],_$Y=3G5.5?_\O^P+V&4``SI!N
  1083. XM[`=X*TC__$'L`U0B;?_\L\AG#D)I``P@;?_\*U#__&#F3EU.=;_L"]AE``,,"
  1084. XM2.<',"9O`!@N+P`<(`?E@"1`?``<&G`4O(!N`B`&+`!Z`+J&;`H0&A>`6`!2+
  1085. XMA6#R0C-8`$S?#.!.=4Y5__"_[`O890`"QDCG`1`F;0`(?@`O/``!``%(>``DU
  1086. XM3KH#>E!/*T#_]DJ`9@9P`&```-HO/``!``%(>`!$3KH#7%!/*T#_\DJ`9A)(!
  1087. XM>``D+RW_]DZZ`KQP`&```+!P`"\`+P!.N@)84$\K0/_\9AY(>``D+RW_]DZZI
  1088. XM`IA(>`!$+RW_\DZZ`HQP`&```(`@;?_R$7P`!0`(0^@`%"%)``HB;?_\(4D`0
  1089. XM#B%(`!1P&2%``!P@+?_V(@#D@2%!`"@A20`8+P@O*P`(3KH!^BZM__Q.N@(T6
  1090. XM(&W_]@RH1$]3```85\!$`$B`2,`N`"ZM__Q.N@)&2'@`)"\M__9.N@(62'@`(
  1091. XM1"\M__).N@(*(`=,[0B`_^A.74YU3E7__+_L"]AE``&P2.<#,"9M``@D;0`,^
  1092. XM?@!*,W``9PX@;0`0$;-P`'``4D=@["`'2,!R.B!M`!"R,`C_9QH@!TC`<B^RJ
  1093. XM,`C_9PY*1V<*2A)G!A&!<`!21WP`2C)@`&<8(`=(P"(&2,'0@2!M`!`1LF``:
  1094. XM"`!21F#B(`=(P"(&2,'0@2!M`!!",`@`3-\,P$Y=3G5.5?_TO^P+V&4``1Y(_
  1095. XMYP<`+BT`""\\``$``$AX`01.N@'44$\K0/_V2H!F!'``8&8O+?_V+P=.N@&&>
  1096. XM(&W_]E"(2&P.QDAL#U(O"&$`_R)/[P`4?``,1@",;!)![`[&0^P/4A.P8`!@N
  1097. XM`%)&8.@O!TZZ`1@J`"Z'3KH!'%A/+@5*AV<(+P=A`/]Z6$](>`$$+RW_]DZZJ
  1098. XM`-9,[0#@_^A.74YUO^P+V&4``()(YP,0)F\`$'X`#$<`C&P6<`!![`[&$8!PQ
  1099. XM`$'L#U(1@'``4D=@Y$AX__XO"TZZ`-Q03RP`2H9F!'``8"PO!F$`_QA83WX`:
  1100. XM#$<`C&P<<"]![`]2L#!P`&8,0>P/4A&\`#IP`&`$4D=@WDS?",!.=4[Y```':
  1101. XM<$[Y````1$[Y````<$[Y```!K$[Y````F$[Y````M$[Y```,V$[Y```#)D[YB
  1102. XM```&K$[Y````'$[Y````?$[Y````6$[Y````A$[Y````:$[Y````&$[Y````7
  1103. XM7$[Y```!X$[Y```$R$[Y````3$[Y````:$[Y```&+$[Y````'$[Y````.$[Y[
  1104. XM```")$[Y```"Z$[Y```&C$[Y`````$[Y```#:$[Y````,$[Y````,$[Y```#A
  1105. XME$[Y````%$[Y`````$[Y`````$[Y````U$[Y````3$[Y```&C$[Y`````$[Y2
  1106. XM````,'!A```#[`````X````````9"@``&)(``!EJ```8P@``&2(``!D<```8P
  1107. XM\@``&+P``!DH```8^```&30``!E&```8M@``&*0````%````!0``&00``!C^*
  1108. XM```9.@``&1```!DN````!P````8``!C:```8F```&7```!B>```8[```&4``.
  1109. XM`!CF````!`````<``!D6```96```&,@``!C4````"0````@``!EV```99```2
  1110. XM&4P``!C.```94@``&+```!E>```8J@``&.`````````#\D```^H````R____`
  1111. XM___^P``````&P`8`!P`&P```#8`&P`X?#`\&P`89GAF&P`89C!F&Q@89C!F&L
  1112. XMQ@\9G@\&P``````&_______^'______PP``````&P`8`!P`&P```#``&P`X'K
  1113. XM``\&P`88'AF&P`8!@!F&Q@`9C!F&Q@\9G@`&P``````&'______PX``````.Q
  1114. XM'@````#P`?```!\```^``^````!X/``````'P`````!X/`````^``^```?``B
  1115. XM`!\`'@````#PX``````.``````/R```#Z@```O5$1C`Z`````$5N=&5R(&UYL
  1116. XM(&9I;&5N86UE`&EN='5I=&EO;BYL:6)R87)Y`&=R87!H:6-S+FQI8G)A<GD`;
  1117. XM```````````%__\"E0*/`H\````````````````````!``\`!```````````0
  1118. XM````````````V0`C`!<`;@````@``P```%H```````````````````!$`!``Z
  1119. XM```````````O``L``@`````!`````````````"\`"P`"````0@,`````````^
  1120. XM`&X`I0`+`"\`"P`&`0(``0```)H```"N`````````````````!(````````-)
  1121. XM=0``#+X````A``````````````````````````````````````#9````V0`*<
  1122. XM````"@````#__O__`0`!!0```1(`````````P@!6`)\`U@`)`````0`$```![
  1123. XM)@```````````````````.X`#`````````V6```,WP```)8`````````````$
  1124. XM`````````````````````````)L```";``H````*`````/_^__\!``$%```!-
  1125. XMA@````````$V`%8`DP"8``D````!``0```&:```````````````````!8@`2<
  1126. XM````````````60```%D`#`````P````!_____P$``04```'6`````$]K```!@
  1127. XM``$``"4``@````````'Z`````````:H`!@"L`%@`"P````$``0```>H`````0
  1128. XM```!_@````````````T```````````!4````5``*````"@````'_____`0`!'
  1129. XM!0```CX`````4&%R96YT```!``$``!,``0````````)B`````````A(`V@`,C
  1130. XM`%,`"0````$``0```E(````````":@````````````\```````````!9````&
  1131. XM60`,````#`````'_____`0`!!0```JH`````0V%N8V5L```!``$``!4``@```
  1132. XM``````+.`````````GX`U0"L`%@`"P````$``0```KX````````"U@``````.
  1133. XM``````X````````````Y````.0`*````"@````'_____`0`!!0```Q8`````Q
  1134. XM4$E013H``0`!```*``$````````#.@````````+J`/4`DP`X``D````!``$`I
  1135. XM``,J`````````T`````````````*````````````.0```#D`"@````H````!!
  1136. XM_____P$``04```.``````"`@("````$``0``#0`!`````````Z0````````#`
  1137. XM5`#U`(<`.``)`````0`!```#E`````````.J````````````"0``````````@
  1138. XM`#D````Y``H````*`````?____\!``$%```#Z@`````@("`@```!``$```T`&
  1139. XM`0````````0.`````````[X`]0!\`#@`"0````$``0```_X````````$%```A
  1140. XM``````````@````````````Y````.0`*````"@````'_____`0`!!0``!%0`J
  1141. XM````("`@(````0`!```-``$````````$>`````````0H`/4`<0`X``D````!@
  1142. XM``$```1H````````!'X````````````'````````````.0```#D`"@````H`\
  1143. XM```!_____P$``04```2^`````"`@("````$``0``#0`!````````!.(`````\
  1144. XM```$D@#U`&8`.``)`````0`!```$T@````````3H````````````!@``````\
  1145. XM`````#D````Y``H````*`````?____\!``$%```%*``````@("`@```!``$`Y
  1146. XM``T``0````````5,````````!/P`]0!;`#@`"0````$``0``!3P````````%X
  1147. XM4@````````````4````````````Y````.0`*````"@````'_____`0`!!0``A
  1148. XM!9(`````("`@(````0`!```-``$````````%M@````````5F`/4`4``X``D`3
  1149. XM```!``$```6F````````!;P````````````$````````````.0```#D`"@``N
  1150. XM``H````!_____P$``04```7\`````"`@("````$``0``#0`!````````!B``%
  1151. XM```````%T`#U`#H`.``)`````0`!```&$`````````8F`````````````@``+
  1152. XM`````````#D````Y``H````*`````?____\!``$%```&9@`````@("`@```!W
  1153. XM``$```T``0````````:*````````!CH`]0!%`#@`"0````$``0``!GH`````<
  1154. XM```&D`````````````,````````````Y````.0`*````"@````'_____`0`!>
  1155. XM!0``!M``````("`@(````0`!```-``$````````&]`````````:D`/4`+P`XK
  1156. XM``D````!``$```;D````````!OH````````````!````````````.0```#D`H
  1157. XM"@````H````!_____P$``04```<Z`````"`@("````$``0``#0`!````````I
  1158. XM!UX````````'#@#U`"0`.``)`````0`!```'3@````````=D````````````6
  1159. XM`````````````,\```#/`&T```!M`````/_^__\!``$%```'I`````````=XD
  1160. XM``8`)`#,`&P``P`"``$```>X```````````````````````1````````#BP`R
  1161. XM``PH````E@`````````````````````````````````````!*0```2D`"@``H
  1162. XM``H`````__[__P$``04```@8````````!\@`!@`8`28`"0````$`!```""P`"
  1163. XM``````````````````?T``L`````1FEL92!P871T97)N```!``$```8`E````
  1164. XM``````AH`````'Y&:6QE;F%M90`!``$```8`GP````````B*```(=D0A:7)EK
  1165. XM8W1O<GD```$``0``!0`-````````"*@```B416YT97(@9FEL96YA;64````&V
  1166. XM``D!,P"[``$``H!P```0`@``"#P````````(R`````````````4`!0*``,@`E
  1167. XM`0`````H*7PC/R4``",_``!90492(%8Q+C(Q(*DQ.3@Y+"`Q.3DP(&)Y($1AD
  1168. XM=F4@4V-H<F5I8F5R``!$:7)E8W1O<GD`4&%T=&5R;@!&:6QE;F%M90``+P!0%
  1169. XM25!%.@`N:6YF;P`O`"\``````````````%!)4$4Z`#H`(S\``%!)4$4Z`"\`K
  1170. XM=3`@("AD:7(I`"`@("`@("`@("`@("`@("`@("`@("`@("``.@`@("`@````/
  1171. XM`````"@`````````````````````````````"?8`````````````````````G
  1172. XM``````````````````````H8````````````````````````````````````B
  1173. XM``````````````````````````````````````````````````````"``````
  1174. XM!```("`@("`@("`@*"@H*"@@("`@("`@("`@("`@("`@("!($!`0$!`0$!`0$
  1175. XM$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!@8$!`0$!`0$!`0$!`0$!`0$!.
  1176. XM`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("`@("`@("`@("$!`0$"`@("`@X
  1177. XM("`@("`H*"@H*"`@("`@("`@("`@("`@("`@($@0$!`0$!`0$!`0$!`0$!"$D
  1178. XMA(2$A(2$A(2$$!`0$!`0$(&!@8&!@0$!`0$!`0$!`0$!`0$!`0$!`0$!$!`0>
  1179. XM$!`0@H*"@H*"`@("`@("`@("`@("`@("`@("`@(0$!`0(````/__````#@`.>
  1180. XM````````````````__\````$``0````````-J```"TC__P````0`!```````4
  1181. XM``V^`````/__````#@`.````````#LX`````__\````$``0`````````````'
  1182. XM"X3__P````0`!`````````[J`````/__````!``$````````#O0````````#8
  1183. XM[`````4````````+S```"[@```N0```+?```"V@````"`````P```+@```"D!
  1184. XM````:P````0```NH```+;```"?8```G4```'^```!_0```%F```!8@```/(`K
  1185. XM``#N```(\@``".H```C$```(P```"*0```B@```(@@``"%X```A.```(/```,
  1186. XM"#0```?:```'R```!\````>2```'B@``!W@```=P```'5@``!R@```<@```'-
  1187. XM#@``!P8```;L```&O@``!K8```:D```&G```!H(```94```&3```!CH```8R%
  1188. XM```&&```!>H```7B```%T```!<@```6N```%@```!7@```5F```%7@``!40`B
  1189. XM``46```%#@``!/P```3T```$V@``!*P```2D```$D@``!(H```1P```$0@``Z
  1190. XM!#H```0H```$(```!`8```/8```#T````[X```.V```#G````VX```-F```#\
  1191. XM5````TP```,R```#!````OP```+J```"X@```L8```*8```"D````GX```)V9
  1192. XM```"6@```BP```(D```"$@```@H```'R```!S````;P```&J```!H@```5@`T
  1193. XM``%(```!-@```2X```#8````U````,(```"0````@`````````/R```#Z0``.
  1194. XM`!](YR`"+'D``!%D3.\`!@`,3J[_K$S?0`1.=0``+PXL>0``$60B+P`(3J[_;
  1195. XMIBQ?3G5(YR`"+'D``!%D3.\`!@`,3J[_FDS?0`1.=0``2.<@`BQY```19$SO9
  1196. XM``8`#$ZN_Y1,WT`$3G4``"\.+'D``!%D(B\`"$ZN_RXL7TYU```#[`````4`N
  1197. XM```$````;````%(````V````(`````8````````#\`````-?4&%R96YT1&ER\
  1198. XM``````!H`````E]%>$YE>'0`````3`````)?17AA;6EN90```#`````"7U5NM
  1199. XM3&]C:P`````<`````E],;V-K``````````````````/R```#Z0```#$O#BQY#
  1200. XM```,#$SO``,`"$ZN_SHL7TYU```O#BQY```,#")O``@@+P`,3J[_+BQ?3G4OU
  1201. XM#BQY```,#"`O``A.KO["+%].=2\.+'D```P,3.\#```(3J[^DBQ?3G4``"\.#
  1202. XM+'D```P,(&\`"$ZN_HPL7TYU+PXL>0``#`PB;P`(3J[^ABQ?3G4O#BQY```,W
  1203. XM#"!O``A.KOZ`+%].=2\.+'D```P,(F\`"$ZN_F(L7TYU+PXL>0``#`PB;P`([
  1204. XM("\`#$ZN_=@L7TYU```#[`````D````$````L````)P```"(````=````&``>
  1205. XM``!(````-````!P````$`````````_`````#7T]P96Y,:6)R87)Y````K```$
  1206. XM``1?0VQO<V5,:6)R87)Y````````F`````-?5V%I=%!O<G0```````"$````F
  1207. XM`U]297!L>4US9P```````'`````"7T=E=$US9P````!<`````E]0=71-<V<`*
  1208. XM````1`````)?5V%I=````````#`````"7T9R965-96T````8`````U]!;&QON
  1209. XM8TUE;0`````````````````#\@```^D````<+PXL>0``#"0B;P`((&\`#"`O4
  1210. XM`!!.KO_$+%].=2\.+'D```PD(F\`"$SO``,`#$ZN_Q`L7TYU``!(YS`"+'D`Q
  1211. XM``PD(F\`$$SO``\`%$ZN_LY,WT`,3G4``"\.+'D```PD(F\`""`O``Q.KOZJ;
  1212. XM+%].=0```^P````$````!````%P````^````(`````0````````#\`````)?7
  1213. XM4V5T05!E;@```%@````#7U)E8W1&:6QL````````.`````)?36]V90``````/
  1214. XM`!P````"7U1E>'0``````````````````_(```/I````/"\.+'D```P@(&\`<
  1215. XM"$ZN_[@L7TYU2.<P`BQY```,($SO``\`$$ZN_YI,WT`,3G4``$CG`"(L>0``:
  1216. XM#"!,[P<```Q.KO]23-]$`$YU``!(YP`B+'D```P@3.\'```,3J[_1DS?1`!.G
  1217. XM=0``+PXL>0``#"`@;P`(3J[_-"Q?3G5(YP`B+'D```P@3.\'```,3J[_(DS?/
  1218. XM1`!.=0``2.<`(BQY```,($SO!P``#$ZN_NQ,WT0`3G4``$CG`"(L>0``#"!,]
  1219. XM[P<```P@+P`83J[^4$S?1`!.=0``2.<`(BQY```,($SO!P``#$ZN_C),WT0`P
  1220. XM3G4``````^P````)````!````-H```"Z````G@```((```!L````4@```#8`G
  1221. XM```:````!`````````/P````!%]!8W1I=F%T94=A9&=E=`````#4````!%]2Z
  1222. XM969R97-H1TQI<W0```````"T````!%]39717:6YD;W=4:71L97,```"8````H
  1223. XM!%]2969R97-H1V%D9V5T<P````!\`````U]/<&5N5VEN9&]W`````&@````#$
  1224. XM7T]N1V%D9V5T````````3`````-?3V9F1V%D9V5T```````P`````U]$;W5B9
  1225. XG;&5#;&EC:P```!0````#7T-L;W-E5VEN9&]W``````````````/R0
  1226. X``
  1227. Xend
  1228. Xsize 16284
  1229. END_OF_FILE
  1230. if test 22833 -ne `wc -c <'yftest.uu'`; then
  1231.     echo shar: \"'yftest.uu'\" unpacked with wrong size!
  1232. fi
  1233. # end of 'yftest.uu'
  1234. fi
  1235. echo shar: End of archive 2 \(of 2\).
  1236. cp /dev/null ark2isdone
  1237. MISSING=""
  1238. for I in 1 2 ; do
  1239.     if test ! -f ark${I}isdone ; then
  1240.     MISSING="${MISSING} ${I}"
  1241.     fi
  1242. done
  1243. if test "${MISSING}" = "" ; then
  1244.     echo You have unpacked both archives.
  1245.     rm -f ark[1-9]isdone
  1246. else
  1247.     echo You still need to unpack the following archives:
  1248.     echo "        " ${MISSING}
  1249. fi
  1250. ##  End of shell archive.
  1251. exit 0
  1252. -- 
  1253. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  1254. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  1255. Post requests for sources, and general discussion to comp.sys.amiga.
  1256.